require "import"
import "android.speech.SpeechRecognizer"
import "android.speech.RecognitionListener"
import "android.speech.RecognizerIntent"
import "java.util.Locale"
import "android.os.VibrationEffect"
import "android.os.Vibrator"
import "android.content.Intent"
import "android.content.Context"
context = activity or service
vibrator = context.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(100)

function CapitalizeSentences(s)
firstLowercaseLetterIndex=utf8.find(s, "[%l]") 
if not (type(firstLowercaseLetterIndex)=='number' and firstLowercaseLetterIndex>=2) then 
s=utf8.gsub(s, "[%l]", function(l)

return utf8.upper(l)

end, 1)
end
s=utf8.gsub(s, "([%.!%?]%s)(%l)", function(p, t)
return p..utf8.upper(t)
end)
s=utf8.gsub(s, "(shift) (%l)", function(p,  t)

return utf8.upper(t)
end)
return s
end


function ReplaceSigns(text)
signs={
[" semn de exclamare"]="!",
[" semn de întrebare"]="?",
[" semnul exclamării"]="!",
[" semnul întrebării"]="?",
[" semnul virgulă"]=",",
[" semnul două puncte"]=":",
[" semnul cratimă "]="-",
["semnul diez"]="#",
["semnul steluță"]="*",
[" semnul arond "]="@",
["semnul tag "]="@",
[" semnul liniuță de subliniere "]="_",
["semnul paranteză deschisă "]="(",
[" semnul paranteză închisă"]=")",
["semnul ghilimele deschise "]="„",
[" semnul ghilimele închise"]="”",
[" semnul punct și virgulă"]=";",
[" semnul elipsă"]="…",
[" semnul puncte de suspensie"]="…",
[" semnul rând nou"]="\n",
["semnul spațiu "]=" ",
["semnul mai mic "]="<",
["semnul mai mare"]=">",
[" semnul bară oblică "]="/",
["semnul paranteză pătrată deschisă "]="[",
[" semnul paranteză pătrată închisă"]="]",
[" semnul bară verticală "]="|",
["semnul drepturi de autor "]="©",
[" semnul tildă "]="~",
[" semnul apostrof "]="'",
[" semnul întrebării inversat"]="¿",
[" semnul exclamării inversat"]="¡",
[" semnul plus "]="+",
["semnul accent grav "]="`",
[" semnul punct"]="."

}
text=utf8.gsub(text, " semnul punct și virgulă", ";")
for  k,v in pairs(signs) do
text=utf8.gsub(text, k, v)
end
goofs={
["ții%-am"]="ți-am",
["ții%-a"]="ți-a",
["ții%-ar"]="ți-ar",
["ții%-el"]="ți-l",
["ții%-o"]="ți-o",
["șii%-a"]="și-a",
["să%-ții"]="să-ți",
["să%-el"]="să-l",
["pe%-am"]="te-am",
["mai%-am"]="mi-am",
["mă%-am"]="m-am",
["mă%-ai"]="m-ai",
["mie%-ai"]="mi-ai",
["mie%-o"]="mi-o",
["mai%-o"]="mi-o",
["mil%-o"]="mi-o",
["mai%-el"]="mi-l",
["el%-am"]="l-am",
[" e%-am"]=" i-am",
["^e%-am "]="i-am "
}
for  k,v in pairs(goofs) do
text=utf8.gsub(text, k, v)
end

text=CapitalizeSentences(text)
return text
end

 
function capWords(str)
return str:gsub("(%S+)", function(word)
return word:gsub("%a", string.upper, 1)
end)
end
function kill()
speechRecognizer.destroy()
speechRecognizer = nil
return true
end
function startListening()
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)
speechListener = RecognitionListener{
onResults = function(results)
data = results.getParcelableArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
if data ~= nil and data.size() > 0 then
service.setText(service.getText(node)..ReplaceSigns(data.get(0)))
end
kill()
end,
onError=function()

--if(pcall(kill)) then

--startListening()
--else
--return 
--end
end}
recognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ro-RO")
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName())
speechRecognizer.startListening(recognizerIntent)
speechRecognizer.setRecognitionListener(speechListener)
end
startListening()
return true